package com.moodincode.taskcenter.controller;

import com.moodincode.taskcenter.bean.TaskInfo;
import com.moodincode.taskcenter.service.IQuartzService;
import org.quartz.CronExpression;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author moodincode
 */
@RestController
@RequestMapping("/quartz")
public class QuartzController {

    @Resource
    private IQuartzService quartzService;

    /**
     * 创建一个脚本引起的任务任务
     *
     * @param task
     * @return
     * @throws Exception
     */
    @PostMapping("/createScriptTask")
    public TaskInfo createScriptTask(@RequestBody TaskInfo task) throws Exception {
        task.setCls("com.moodincode.taskcenter.job.JavaScriptJob");
        return quartzService.createTask(task);
    }
    /**
     * 获取所有任务
     *
     * @return
     */
    @GetMapping("/findAll")
    public List<TaskInfo> findAll() {
        return quartzService.findAll();
    }

    /**
     * 获取单个任务
     *
     * @param id
     * @return
     */
    @GetMapping("/getTaskById")
    public TaskInfo getTaskById(String id) {
        return quartzService.getTaskById(id);
    }

    /**
     * 暂停一个任务
     *
     * @param id
     * @return
     */
    @GetMapping("/pauseTask")
    public TaskInfo pauseTask(String id) {
        return quartzService.pauseTask(id);
    }

    /**
     * 创建一个任务
     *
     * @param task
     * @return
     * @throws Exception
     */
    @PostMapping("/createTask")
    public TaskInfo createTask(@RequestBody TaskInfo task) throws Exception {
        return quartzService.createTask(task);
    }

    /**
     * 修改一个任务
     *
     * @param id
     * @param cron
     * @return
     */
    @GetMapping("/modifyTask")
    public TaskInfo modifyTask(String id, String cron) {
        return quartzService.modifyTask(id,cron,null);
    }
    /**
     * 修改一个任务
     *
     * @param task
     * @return
     */
    @PostMapping("/modifyScriptTask")
    public TaskInfo modifyScriptTask(@RequestBody TaskInfo task) {
        return quartzService.modifyTask(task.getId(),task.getCron(),task.getScript());
    }

    /**
     * 删除单个任务
     *
     * @param id
     * @return
     */
    @GetMapping("/removeTask")
    public TaskInfo removeTask(String id) {
        return quartzService.removeTask(id);
    }

    /**
     * 重启一个任务
     *
     * @param id
     * @return
     */
    @GetMapping("/restartTask")
    public TaskInfo restartTask(String id) {
        return quartzService.restartTask(id);
    }

    /**
     * 关闭一个任务
     *
     * @param id
     * @return
     */
    @GetMapping("/shutdownTask")
    public TaskInfo shutdownTask(String id) {
        return quartzService.shutdownTask(id);
    }

    /**
     * 触发一次定时任务的执行
     *
     * @param id
     * @return
     */
    @GetMapping("/triggerTask")
    public TaskInfo triggerTask(String id) {
        return quartzService.triggerTask(id);
    }

    /**
     * 启动所有任务
     */
    @GetMapping("/startAllTask")
    public String startAllTask() {
        quartzService.startAllTask();
        return "success";
    }

    /**
     * 关闭所有任务
     */
    @GetMapping("/shutdownAllTask")
    public String shutdownAllTask() {
        quartzService.shutdownAllTask();
        return "success";
    }

    /**
     * 重启所有任务
     */
    @GetMapping("/resumeAllTask")
    public String resumeAllTask() {
        quartzService.resumeAllTask();
        return "success";
    }

    /**
     * 暂停所有任务
     */
    @GetMapping("/pauseAllTask")
    public String pauseAllTask() {
        quartzService.pauseAllTask();
        return "success";
    }
    /**
     * 获取表达式中最近10次将要执行的时间
     */
    @GetMapping("/getScheduleDateList")
    public List<String> getScheduleDateList(String cron) {
        if(!StringUtils.hasText(cron)){
            return null;
        }
        List<String> recentDates=new ArrayList<>();
        try {

            CronExpression expression=new CronExpression(cron);
            Date date=new Date();
            SimpleDateFormat dateTimeFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            for (int i = 0; i < 10; i++) {
                date= expression.getNextValidTimeAfter(date);
                if(date==null){
                    return recentDates;
                }else{
                    recentDates.add(dateTimeFormatter.format(date));
                }
            }

        } catch (ParseException e) {
           return null;
        }
        return recentDates;
    }
}
